#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>

#define BOX_HEADER_SIZE 8

// 读取一个盒子的大小和类型
void read_box(FILE *file, char *box_type, size_t *box_size) {
    fread(box_size, 4, 1, file); // 读取盒子大小
    fread(box_type, 4, 1, file);  // 读取盒子类型
    *box_size = ntohl(*box_size); // 转换为主机字节序
}

// 查找并打印 udta 盒子内容
void read_udta(const char *filename) {
    FILE *file = fopen(filename, "rb");
    if (!file) {
        perror("Failed to open file");
        return;
    }

    // 获取文件大小
    fseek(file, 0, SEEK_END);
    long file_size = ftell(file);
    fseek(file, 0, SEEK_SET); // 重置文件指针到开头

    char box_type[5] = {0};
    size_t box_size = 0;

    // 读取文件直到找到 udta 盒子
    while (ftell(file) < file_size) {
        read_box(file, box_type, &box_size);
        printf("Reading box: type=%s, size=%zu\n", box_type, box_size); // 调试信息

        if (strcmp(box_type, "udta") == 0) {
            printf("Found udta box, size: %zu bytes\n", box_size);
            // 读取 udta 盒子的内容
            unsigned char *data = (unsigned char *)malloc(box_size - BOX_HEADER_SIZE);
            fread(data, box_size - BOX_HEADER_SIZE, 1, file);
            printf("udta data: ");
            for (size_t i = 0; i < box_size - BOX_HEADER_SIZE; i++) {
                printf("%02x ", data[i]);
            }
            printf("\n");
            free(data);
            break; // 找到 udta 后退出
        } else {
            // 跳过当前盒子
            fseek(file, box_size - BOX_HEADER_SIZE, SEEK_CUR);
        }
    }

    fclose(file);
}

int main(int argc, char *argv[]) {
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <mp4_file>\n", argv[0]);
        return 1;
    }

    read_udta(argv[1]);
    return 0;
} 


/*
gcc -o read_udta read_udta.c -lavformat -lavcodec -lavutil
*/